<?php

/**
 * BbPrestamo form.
 *
 * @package    ingenyo-biblio
 * @subpackage form
 * @author     Your name here
 */
class BbPrestamoForm extends BaseBbPrestamoForm
{

  public function configure()
  {
    parent::configure();

    unset($this['fechaEntrega'], $this['fechaVencimientoPrestamo'], $this['fechaRealDevolucion'], $this['usuario'], $this['bb_prestamo_regla_list']);

    $id_documento = $this->getOption('idDocumento');

    $this->setWidget('IdPersona', new pmWidgetFormPropelJQuerySearch(array('model' => 'BbPersona',
        'column' => array('NOMBRESPERSONA', 'APELLIDOPERSONA'),
        'selected_label' => 'Seleccione una persona',
        'search_label' => 'Buscar')));
    $this->getWidget('IdPersona')->setLabel('Persona');
    $this->getWidget('idTipoPrestamo')->setLabel('Tipo de prestamo');

    $criteria_libros_disponibles = CtDocumentoPeer::getLibrosDisponiblesCriteria($id_documento);
    $this->getWidget('idLibro')->setOption('criteria', $criteria_libros_disponibles);
    $this->getWidget('idLibro')->setOption('method', 'getInventariolibro');
    $this->getWidget('idLibro')->setLabel('Inventario');

    $this->setWidget('Observacion', new sfWidgetFormTextarea());
    $this->setWidget('investigador', new sfWidgetFormInputCheckbox(array(
        'label' => 'Investigador'
      )));
    $this->setWidget('prestamo_especial', new sfWidgetFormInputCheckbox(array(
        'label' => 'Prestamo especial'
      )));
    $this->setWidget('fechaGenera', new sfWidgetFormInputHidden());
    $this->setValidator('fechaGenera', new sfValidatorPass());
    $this->setDefault('fechaGenera', time());
    $this->setValidator('investigador', new sfValidatorPass());
    $this->setValidator('prestamo_especial', new sfValidatorPass());

    $this->setWidget('cantidad_dias', new sfWidgetFormJQueryScale(array(
        'min' => '1',
        'max' => '15',
        'label' => 'Cantidad de dias'
      )));
    $this->setValidator('cantidad_dias', new sfValidatorInteger);

    $this->validatorSchema->setPostValidator(
      new sfValidatorCallback(array('callback' => array($this, 'validarPrestamo')))
    );

    $this->validatorSchema->setOption('allow_extra_fields', true);

  }

  public function validarPrestamo($validator, $values)
  {
    if (!is_null($values['IdPersona']) && !is_null($values['cantidad_dias']))
    {
      $documento = CtDocumentoPeer::retrieveByPK($this->getOption('idDocumento'));
      if (($values['idTipoPrestamo'] == ReferenceTipoPrestamo::ENSALA) || ($documento->getCantidadEjemplaresDisponibles() != 1))
      {
        $cant_dias = $values['cantidad_dias'];
        $libro = CtLibroPeer::retrieveByPk($values['idLibro']);
        $persona = BbPersonaPeer::getPersona($values['IdPersona']);
        if (is_null($persona))
        {
          $error = new sfValidatorError($validator, 'La persona seleccionada no posee un TIPO DE PERSONA.');
          throw new sfValidatorErrorSchema($validator, array('IdPersona' => $error));
        }
        $max_dias_persona = $persona->getMaxDiasPrestamoDomiciliario($values['investigador']);

        if (ReferenceEstadoPersona::SUSPENDIDO == $persona->getIdEstado())
        {
          $error = new sfValidatorError($validator, 'La persona seleccionada se encuentra actualmente SUSPENDIDA.');
          throw new sfValidatorErrorSchema($validator, array('IdPersona' => $error));
        }
        elseif ($persona->getCantPrestamos() == $persona->getCantPrestamosSimultaneos())
        {
          $error = new sfValidatorError($validator, 'La persona seleccionada exede la cantidad de prestamos simultaneos permitida.');
          throw new sfValidatorErrorSchema($validator, array('IdPersona' => $error));
        }
        elseif ($cant_dias > $max_dias_persona)
        {
          $error = new sfValidatorError($validator, 'La cantidad de dias maximo para la persona seleccionada es: ' . $max_dias_persona . '.');
          throw new sfValidatorErrorSchema($validator, array('cantidad_dias' => $error));
        }
      }
      else
      {
        $error = new sfValidatorError($validator, 'Queda disponible un solo ejemplar y solo puede ser prestado en sala.');
        throw new sfValidatorErrorSchema($validator, array('idTipoPrestamo' => $error));
      }
    }

    return $values;

  }

  protected function doSave($con = null)
  {
    $prestamo = $this->getObject();
    $cant_dias = $this->getValue('cantidad_dias');
    $libro = CtLibroPeer::retrieveByPK($this->getValue('idLibro'));
    $prestamo->setUsuario(sfContext::getInstance()->getUser()->getGuardUser()->getId());
    $prestamo->setFechas($cant_dias);
    $libro->prestar();
    $libro->save($con);

    parent::doSave($con);

  }

}
